%{
#include <string.h>
char bfr[20];
%}
%x zig
%%
\<[^>]*\> { ECHO; }
(\[[^\]\[]*(\[[^\]\[]*\][^\]\[]*)*\])+ { ECHO; }

0?1[.] printf("erste");
0?2[.] printf("zweite");
0?3[.] printf("dritte");
0?4[.] printf("vierte");
0?5[.] printf("f\"unfte");
0?6[.] printf("sechste");
0?7[.] printf("siebte");
0?8[.] printf("achte");
0?9[.] printf("neunte");
10[.] printf("zehnte");
11[.] printf("elfte");
12[.] printf("zw\"olfte");
13[.] printf("dreizehnte");
14[.] printf("vierzehnte");
15[.] printf("f\"unfzehnte");
16[.] printf("sechzehnte");
17[.] printf("siebzehnte");
18[.] printf("achtzehnte");
19[.] printf("neunzehnte");
20[.] printf("zwanzigste");
21[.] printf("einundzwanzigste");
22[.] printf("zweiundzwanzigste");
23[.] printf("dreiundzwanzigste");
24[.] printf("vierundzwanzigste");
25[.] printf("f\"unfundzwanzigste");
26[.] printf("sechsundzwanzigste");
27[.] printf("siebenundzwanzigste");
28[.] printf("achtundzwanzigste");
29[.] printf("neunundzwanzigste");
30[.] printf("drei\"sigste");
31[.] printf("einunddrei\"sigste");
0/[^0-9] printf("null");
0 ;
<zig>1/[^0-9] {printf("einund%s",&bfr);BEGIN INITIAL;}
<zig>1000/[^0-9] {printf("einund%stausend",&bfr);BEGIN INITIAL;}
<zig>1/[0-9][0-9][0-9][^0-9] {printf("einund%stausend",&bfr);BEGIN INITIAL;}
<zig>2/[^0-9] {printf("zweiund%s",&bfr);BEGIN INITIAL;}
<zig>2000/[^0-9] {printf("zweiund%stausend",&bfr);BEGIN INITIAL;}
<zig>2/[0-9][0-9][0-9][^0-9] {printf("zweiund%stausend",&bfr);BEGIN INITIAL;}
<zig>3/[^0-9] {printf("dreiund%s",&bfr);BEGIN INITIAL;}
<zig>3000/[^0-9] {printf("dreiund%stausend",&bfr);BEGIN INITIAL;}
<zig>3/[0-9][0-9][0-9][^0-9] {printf("dreiund%stausend",&bfr);BEGIN INITIAL;}
<zig>4/[^0-9] {printf("vierund%s",&bfr);BEGIN INITIAL;}
<zig>4000/[^0-9] {printf("vierund%stausend",&bfr);BEGIN INITIAL;}
<zig>4/[0-9][0-9][0-9][^0-9] {printf("vierund%stausend",&bfr);BEGIN INITIAL;}
<zig>5/[^0-9] {printf("f\"unfund%s",&bfr);BEGIN INITIAL;}
<zig>5000/[^0-9] {printf("f\"unfund%stausend",&bfr);BEGIN INITIAL;}
<zig>5/[0-9][0-9][0-9][^0-9] {printf("f\"unfund%stausend",&bfr);BEGIN INITIAL;}
<zig>6/[^0-9] {printf("sechsund%s",&bfr);BEGIN INITIAL;}
<zig>6000/[^0-9] {printf("sechsund%stausend",&bfr);BEGIN INITIAL;}
<zig>6/[0-9][0-9][0-9][^0-9] {printf("sechsund%stausend",&bfr);BEGIN INITIAL;}
<zig>7/[^0-9] {printf("siebenund%s",&bfr);BEGIN INITIAL;}
<zig>7000/[^0-9] {printf("siebenund%stausend",&bfr);BEGIN INITIAL;}
<zig>7/[0-9][0-9][0-9][^0-9] {printf("siebenund%stausend",&bfr);BEGIN INITIAL;}
<zig>8/[^0-9] {printf("achtund%s",&bfr);BEGIN INITIAL;}
<zig>8000/[^0-9] {printf("achtund%stausend",&bfr);BEGIN INITIAL;}
<zig>8/[0-9][0-9][0-9][^0-9] {printf("achtund%stausend",&bfr);BEGIN INITIAL;}
<zig>9/[^0-9] {printf("neunund%s",&bfr);BEGIN INITIAL;}
<zig>9000/[^0-9] {printf("neunund%stausend",&bfr);BEGIN INITIAL;}
<zig>9/[0-9][0-9][0-9][^0-9] {printf("neunund%stausend",&bfr);BEGIN INITIAL;}
^1700/[^0-9] printf("siebzehnhundert");
[ ]1700/[^0-9] printf(" siebzehnhundert");
^17/[0-9][0-9][^0-9] printf("siebzehnhundert");
[ ]17/[0-9][0-9][^0-9] printf(" siebzehnhundert");
^1800/[^0-9] printf("achtzehnhundert");
[ ]1800/[^0-9] printf(" achtzehnhundert");
^18/[0-9][0-9][^0-9] printf("achtzehnhundert");
[ ]18/[0-9][0-9][^0-9] printf(" achtzehnhundert");
^1900/[^0-9] printf("neunzehnhundert");
[ ]1900/[^0-9] printf(" neunzehnhundert");
^19/[0-9][0-9][^0-9] printf("neunzehnhundert");
[ ]19/[0-9][0-9][^0-9] printf(" neunzehnhundert");
1000/[^0-9] printf("eintausend");
2000/[^0-9] printf("zweitausend");
3000/[^0-9] printf("dreitausend");
4000/[^0-9] printf("viertausend");
5000/[^0-9] printf("f\"unftausend");
6000/[^0-9] printf("sechstausend");
7000/[^0-9] printf("siebentausend");
8000/[^0-9] printf("achttausend");
9000/[^0-9] printf("neuntausend");
1/[^0-9] printf("eins");
1/[0-9][0-9][0-9][^0-9] printf("eintausend");
2/[^0-9] printf("zwei");
2/[0-9][0-9][0-9][^0-9] printf("zweitausend");
3/[^0-9] printf("drei");
3/[0-9][0-9][0-9][^0-9] printf("dreitausend");
4/[^0-9] printf("vier");
4/[0-9][0-9][0-9][^0-9] printf("viertausend");
5/[^0-9] printf("f\"unf");
5/[0-9][0-9][0-9][^0-9] printf("f\"unftausend");
6/[^0-9] printf("sechs");
6/[0-9][0-9][0-9][^0-9] printf("sechstausend");
7/[^0-9] printf("sieben");
7/[0-9][0-9][0-9][^0-9] printf("siebentausend");
8/[^0-9] printf("acht");
8/[0-9][0-9][0-9][^0-9] printf("achttausend");
9/[^0-9] printf("neun");
9/[0-9][0-9][0-9][^0-9] printf("neuntausend");
10/[^0-9] printf("zehn");
10/[0-9][0-9][0-9][^0-9] printf("zehntausend");
11/[^0-9] printf("elf");
11/[0-9][0-9][0-9][^0-9] printf("elftausend");
12/[^0-9] printf("zw\"olf");
12/[0-9][0-9][0-9][^0-9] printf("zw\"olftausend");
13/[^0-9] printf("dreizehn");
13/[0-9][0-9][0-9][^0-9] printf("dreizehntausend");
14/[^0-9] printf("vierzehn");
14/[0-9][0-9][0-9][^0-9] printf("vierzehntausend");
15/[^0-9] printf("f\"unfzehn");
15/[0-9][0-9][0-9][^0-9] printf("f\"unfzehntausend");
16/[^0-9] printf("sechzehn");
16/[0-9][0-9][0-9][^0-9] printf("sechzehntausend");
17/[^0-9] printf("siebzehn");
17/[0-9][0-9][0-9][^0-9] printf("siebzehntausend");
18/[^0-9] printf("achtzehn");
18/[0-9][0-9][0-9][^0-9] printf("achtzehntausend");
19/[^0-9] printf("neunzehn");
19/[0-9][0-9][0-9][^0-9] printf("neunzehntausend");
20/[^0-9] printf("zwanzig");
20/[0-9][0-9][0-9][^0-9] printf("zwanzigtausend");
30/[^0-9] printf("drei\"sig");
30/[0-9][0-9][0-9][^0-9] printf("drei\"sigtausend");
40/[^0-9] printf("vierzig");
40/[0-9][0-9][0-9][^0-9] printf("vierzigtausend");
50/[^0-9] printf("f\"unfzig");
50/[0-9][0-9][0-9][^0-9] printf("f\"unfzigtausend");
60/[^0-9] printf("sechzig");
60/[0-9][0-9][0-9][^0-9] printf("sechzigtausend");
70/[^0-9] printf("siebzig");
70/[0-9][0-9][0-9][^0-9] printf("siebzigtausend");
80/[^0-9] printf("achtzig");
80/[0-9][0-9][0-9][^0-9] printf("achtzigtausend");
90/[^0-9] printf("neunzig");
90/[0-9][0-9][0-9][^0-9] printf("neunzigtausend");
2/[0-9][0-9][0-9][0-9][^0-9] {strcpy(bfr, "zwanzig");BEGIN zig;}
3/[0-9][0-9][0-9][0-9][^0-9] {strcpy(bfr, "drei\"sig");BEGIN zig;}
4/[0-9][0-9][0-9][0-9][^0-9] {strcpy(bfr, "vierzig");BEGIN zig;}
5/[0-9][0-9][0-9][0-9][^0-9] {strcpy(bfr, "f\"unfzig");BEGIN zig;}
6/[0-9][0-9][0-9][0-9][^0-9] {strcpy(bfr, "sechzig");BEGIN zig;}
7/[0-9][0-9][0-9][0-9][^0-9] {strcpy(bfr, "siebzig");BEGIN zig;}
8/[0-9][0-9][0-9][0-9][^0-9] {strcpy(bfr, "achtzig");BEGIN zig;}
9/[0-9][0-9][0-9][0-9][^0-9] {strcpy(bfr, "neunzig");BEGIN zig;}
2/[0-9][^0-9] {strcpy(bfr, "zwanzig");BEGIN zig;}
3/[0-9][^0-9] {strcpy(bfr, "drei\"sig");BEGIN zig;}
4/[0-9][^0-9] {strcpy(bfr, "vierzig");BEGIN zig;}
5/[0-9][^0-9] {strcpy(bfr, "f\"unfzig");BEGIN zig;}
6/[0-9][^0-9] {strcpy(bfr, "sechzig");BEGIN zig;}
7/[0-9][^0-9] {strcpy(bfr, "siebzig");BEGIN zig;}
8/[0-9][^0-9] {strcpy(bfr, "achtzig");BEGIN zig;}
9/[0-9][^0-9] {strcpy(bfr, "neunzig");BEGIN zig;}
100000/[^0-9] {printf("einhunderttausend");}
100/[^0-9] {printf("einhundert");}
100/[0-9][0-9][0-9][^0-9] {printf("einhunderttausend");}
1/[0-9][0-9][^0-9] {printf("einhundert");}
1/[0-9][0-9][0-9][0-9][0-9][^0-9] {printf("einhundert");}
200/[^0-9] {printf("zweihundert");}
200/[0-9][0-9][0-9][^0-9] {printf("zweihunderttausend");}
2/[0-9][0-9][^0-9] {printf("zweihundert");}
2/[0-9][0-9][0-9][0-9][0-9][^0-9] {printf("zweihundert");}
300/[^0-9] {printf("dreihundert");}
300/[0-9][0-9][0-9][^0-9] {printf("dreihunderttausend");}
3/[0-9][0-9][^0-9] {printf("dreihundert");}
3/[0-9][0-9][0-9][0-9][0-9][^0-9] {printf("dreihundert");}
400/[^0-9] {printf("vierhundert");}
400/[0-9][0-9][0-9][^0-9] {printf("vierhunderttausend");}
4/[0-9][0-9][^0-9] {printf("vierhundert");}
4/[0-9][0-9][0-9][0-9][0-9][^0-9] {printf("vierhundert");}
500/[^0-9] {printf("f\"unfhundert");}
500/[0-9][0-9][0-9][^0-9] {printf("f\"unfhunderttausend");}
5/[0-9][0-9][^0-9] {printf("f\"unfhundert");}
5/[0-9][0-9][0-9][0-9][0-9][^0-9] {printf("f\"unfhundert");}
600/[^0-9] {printf("sechshundert");}
600/[0-9][0-9][0-9][^0-9] {printf("sechshunderttausend");}
6/[0-9][0-9][^0-9] {printf("sechshundert");}
6/[0-9][0-9][0-9][0-9][0-9][^0-9] {printf("sechshundert");}
700/[^0-9] {printf("siebenhundert");}
700/[0-9][0-9][0-9][^0-9] {printf("siebenhunderttausend");}
7/[0-9][0-9][^0-9] {printf("siebenhundert");}
7/[0-9][0-9][0-9][0-9][0-9][^0-9] {printf("siebenhundert");}
800/[^0-9] {printf("achthundert");}
800/[0-9][0-9][0-9][^0-9] {printf("achthunderttausend");}
8/[0-9][0-9][^0-9] {printf("achthundert");}
8/[0-9][0-9][0-9][0-9][0-9][^0-9] {printf("achthundert");}
900/[^0-9] {printf("neunhundert");}
900/[0-9][0-9][0-9][^0-9] {printf("neunhunderttausend");}
9/[0-9][0-9][^0-9] {printf("neunhundert");}
9/[0-9][0-9][0-9][0-9][0-9][^0-9] {printf("neunhundert");}
%%
main(argc, argv)
int argc;
char **argv;
{
  int i;

  ++argv; --argc; /* skip over program name */

  if(argc>0){
    for(i=0; i<argc; i++){
      yyin = fopen(argv[i],"r");
      if (yyin==NULL) 
        fprintf(stderr,"could not open %s --- skipped.\n",argv[i]);
      else {
        yylex();
      }
    }
  } else {
    yyin=stdin;
    yylex();
  }
}

